#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <conio.h>

int main(int argc, char **argv) {
	double raio = 0.1, coef = 0.87,teta;
	long double v,m,l,s, h = 0.001, compx = 1, t = 0.0, tmax=2.0, sx, s0x, tlin1, tlin2, vx, s0y, compy = 1, vy, sy, g=-9.8, v0y, v0x;
	s0x = 0.5;
	s0y = 0.9;
	v0x = 0.5;
	v0y = 3.9;


	while (t < tmax) {
		//printf("v0y: %Lf,v0x: %Lf\n", v0y,v0x);
		sx = s0x + (v0x * h); // atualizando x // sx = 0.501 + (0.1*0.01)
		sy = s0y + v0y*h + 0.5*g*h*h; // atualizando y
		vy = v0y + g*h;

		if(sx > (compx - raio)) { 					//colisão do lado direito da caixa
			tlin1 = (((compx - raio) - s0x) / v0x);  // tlin1 = tempo decorrido entre a posicao anterior e o limite superior em x
			tlin2 = h - tlin1;        				// tlin2 = parcela de tempo da amostragem que estará com nova velocidade
			vy = v0y + g*tlin1;						//velocidade q a bola
			teta = atan(v0y/v0x);
			v = pow(pow(v0x,2.0)+pow(vy,2.0),0.5)*0.87;  //modulo da velocidade
			s = fabs(sin(teta));
			//s = pow(s,2.0);
			//s = pow (s,0.5);

			vx = - v * cos(teta);              			// inversao da velocidade mais a desaceleracao do coef. de restituicao
			v0y = (v*s*(v0y/fabs(v0y))) + g*h;
			sx = (compx - raio) + vx * tlin2;
			v0x = vx;
			//v0y = vy;
		} else if (sx < raio) {
			tlin1 = ((raio - s0x) / v0x); // tlin1 = tempo decorrido entre a posicao anterior e o limite superior em x
			tlin2 = h - tlin1; // tlin2 = parcela de tempo da amostragem que estará com nova velocidade
			teta = atan(v0y/v0x);
			v = pow(pow(v0x,2.0)+pow(vy,2.0),0.5)*0.87;  //modulo da velocidade
			s = fabs(sin(teta));
			//s = pow(s,2.0);
			//s = pow (s,0.5);

			vx = v * cos(teta); // inversao da velocidade mais a desaceleracao do coef. de restituicao
			v0y = (v*s*(v0y/fabs(v0y))) + g*h;
			sx = raio + vx * tlin2;
			v0x = vx;
			//v0y = vy;
		}
		//printf("v0y: %Lf,vy: %Lf, sy: %Lf,tlin2: %Lf, \n", v0y, vy,sy,tlin2);
		// printf("v0y: %Lf,sy: %Lf\n", v0y,sy);
		if (sy > (compy - raio)) {
			vy = (v0y*v0y) + 2*g*(compy-raio-s0y);
			vy = pow(vy,0.5);
			//printf("else2.1 -v0y: %Lf,vy: %Lf,sy: %Lf\n", v0y,vy,sy);
			tlin1 = ((vy-v0y)/g);
			tlin2 = h-tlin1;
			teta = atan((vy/v0x));
			v = pow(pow(v0x,2.0)+pow(vy,2.0),0.5)*0.87;
			s = fabs(sin(teta));
			//s = pow(s,2.0);
			//s = pow (s,0.5);
			v0x = v*cos(teta)*(v0x/(fabs(v0x)));        //PROBLEMA - tenho que armazenar o sinal da vel????
			vy = -v*s;
			//vy = v*sin(teta);
			//printf("else2.3 -teta: %Lf, , seno teta: %Lf\n", teta,sin(teta));
			//sy = compy - raio - vy*tlin2 + 0.5*g*tlin2*tlin2;
			//vy = -(vy + g*tlin2);
			sy = compy - raio + vy*tlin2 + 0.5*g*tlin2*tlin2;
			vy = (vy + g*tlin2);
			//vy = -coef*(vy + g*tlin2);
			//printf("else2.2 -v0y: %Lf,v0x: %Lf, vy: %Lf\n", v0y,v0x,vy);
			//printf("else2.3 -s: %Lf, ,teta: %Lf\n", s,teta);
			v0y  = vy;
		} else if (sy < raio) {
			vy = (v0y*v0y) + 2*g*(raio-s0y);
			vy = (-1)*pow(vy,0.5);

			tlin1 = ((vy-v0y)/g);
			tlin2 = h-tlin1;
			teta = atan((vy/v0x));
			v = pow(pow(v0x,2.0)+pow(vy,2.0),0.5)*0.87;
			s = fabs(sin(teta));
			//s = pow(s,2.0);
			//s = pow (s,0.5);
			v0x = v*cos(teta)*(v0x/(fabs(v0x)));     //PROBLEMA - tenho que armazenar o sinal da vel?????
			//vy = v*sin(teta);
			vy = v*s;
			//printf("else2.3 -teta: %f, , seno teta: %f\n", teta,sin(teta));
			sy = raio + vy*tlin2 + 0.5*g*tlin2*tlin2;
			vy = (vy + g*tlin2);
			v0y  = vy;
		}

		//v0y  = vy;
		/* código MPI
    	 if (colidiu) {


    	}*/
		t = t+h;
		s0x = sx;
		s0y = sy;
		v0y  = vy;
		//v0x = vx;
		printf("%Lf, %Lf\n", s0x, s0y);

	}
	while(!kbhit()){
	}
}
